// ============================================================================
//
// LCP-net framework by Pierre CHATEL chatelp@gmail.com
// Distributed under GPLv3
// Copyright (C) THALES Land & Joint Systems, 2008, 2009. All rights reserved
//
// ============================================================================

/**
 * <copyright>
 * </copyright>
 *
 * $Id$
 */
package com.thalesgroup.preferenceFramework.models.impl;

import com.thalesgroup.preferenceFramework.models.Arc;

import com.thalesgroup.preferenceFramework.models.LCPnet.LCPnetPackage;

import com.thalesgroup.preferenceFramework.models.LCPnet.fragments.FragmentsPackage;

import com.thalesgroup.preferenceFramework.models.LCPnet.fragments.impl.FragmentsPackageImpl;

import com.thalesgroup.preferenceFramework.models.LCPnet.impl.LCPnetPackageImpl;

import com.thalesgroup.preferenceFramework.models.ModelsFactory;
import com.thalesgroup.preferenceFramework.models.ModelsPackage;
import com.thalesgroup.preferenceFramework.models.Namable;
import com.thalesgroup.preferenceFramework.models.Node;
import com.thalesgroup.preferenceFramework.models.NodeValue;
import com.thalesgroup.preferenceFramework.models.Outcome;
import com.thalesgroup.preferenceFramework.models.PreferenceNetwork;

import com.thalesgroup.preferenceFramework.models.exceptions.ExceptionsPackage;

import com.thalesgroup.preferenceFramework.models.exceptions.impl.ExceptionsPackageImpl;

import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EOperation;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EReference;

import org.eclipse.emf.ecore.impl.EPackageImpl;

/**
 * <!-- begin-user-doc -->
 * An implementation of the model <b>Package</b>.
 * <!-- end-user-doc -->
 * @generated
 */
public class ModelsPackageImpl extends EPackageImpl implements ModelsPackage {
	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass preferenceNetworkEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass nodeEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass arcEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass nodeValueEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass outcomeEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass namableEClass = null;

	/**
	 * Creates an instance of the model <b>Package</b>, registered with
	 * {@link org.eclipse.emf.ecore.EPackage.Registry EPackage.Registry} by the package
	 * package URI value.
	 * <p>Note: the correct way to create the package is via the static
	 * factory method {@link #init init()}, which also performs
	 * initialization of the package, or returns the registered package,
	 * if one already exists.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.emf.ecore.EPackage.Registry
	 * @see com.thalesgroup.preferenceFramework.models.ModelsPackage#eNS_URI
	 * @see #init()
	 * @generated
	 */
	private ModelsPackageImpl() {
		super(eNS_URI, ModelsFactory.eINSTANCE);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private static boolean isInited = false;

	/**
	 * Creates, registers, and initializes the <b>Package</b> for this
	 * model, and for any others upon which it depends.  Simple
	 * dependencies are satisfied by calling this method on all
	 * dependent packages before doing anything else.  This method drives
	 * initialization for interdependent packages directly, in parallel
	 * with this package, itself.
	 * <p>Of this package and its interdependencies, all packages which
	 * have not yet been registered by their URI values are first created
	 * and registered.  The packages are then initialized in two steps:
	 * meta-model objects for all of the packages are created before any
	 * are initialized, since one package's meta-model objects may refer to
	 * those of another.
	 * <p>Invocation of this method will not affect any packages that have
	 * already been initialized.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #eNS_URI
	 * @see #createPackageContents()
	 * @see #initializePackageContents()
	 * @generated
	 */
	public static ModelsPackage init() {
		if (isInited) return (ModelsPackage)EPackage.Registry.INSTANCE.getEPackage(ModelsPackage.eNS_URI);

		// Obtain or create and register package
		ModelsPackageImpl theModelsPackage = (ModelsPackageImpl)(EPackage.Registry.INSTANCE.getEPackage(eNS_URI) instanceof ModelsPackageImpl ? EPackage.Registry.INSTANCE.getEPackage(eNS_URI) : new ModelsPackageImpl());

		isInited = true;

		// Obtain or create and register interdependencies
		ExceptionsPackageImpl theExceptionsPackage = (ExceptionsPackageImpl)(EPackage.Registry.INSTANCE.getEPackage(ExceptionsPackage.eNS_URI) instanceof ExceptionsPackageImpl ? EPackage.Registry.INSTANCE.getEPackage(ExceptionsPackage.eNS_URI) : ExceptionsPackage.eINSTANCE);
		LCPnetPackageImpl theLCPnetPackage = (LCPnetPackageImpl)(EPackage.Registry.INSTANCE.getEPackage(LCPnetPackage.eNS_URI) instanceof LCPnetPackageImpl ? EPackage.Registry.INSTANCE.getEPackage(LCPnetPackage.eNS_URI) : LCPnetPackage.eINSTANCE);
		com.thalesgroup.preferenceFramework.models.LCPnet.exceptions.impl.ExceptionsPackageImpl theExceptionsPackage_1 = (com.thalesgroup.preferenceFramework.models.LCPnet.exceptions.impl.ExceptionsPackageImpl)(EPackage.Registry.INSTANCE.getEPackage(com.thalesgroup.preferenceFramework.models.LCPnet.exceptions.ExceptionsPackage.eNS_URI) instanceof com.thalesgroup.preferenceFramework.models.LCPnet.exceptions.impl.ExceptionsPackageImpl ? EPackage.Registry.INSTANCE.getEPackage(com.thalesgroup.preferenceFramework.models.LCPnet.exceptions.ExceptionsPackage.eNS_URI) : com.thalesgroup.preferenceFramework.models.LCPnet.exceptions.ExceptionsPackage.eINSTANCE);
		FragmentsPackageImpl theFragmentsPackage = (FragmentsPackageImpl)(EPackage.Registry.INSTANCE.getEPackage(FragmentsPackage.eNS_URI) instanceof FragmentsPackageImpl ? EPackage.Registry.INSTANCE.getEPackage(FragmentsPackage.eNS_URI) : FragmentsPackage.eINSTANCE);

		// Create package meta-data objects
		theModelsPackage.createPackageContents();
		theExceptionsPackage.createPackageContents();
		theLCPnetPackage.createPackageContents();
		theExceptionsPackage_1.createPackageContents();
		theFragmentsPackage.createPackageContents();

		// Initialize created meta-data
		theModelsPackage.initializePackageContents();
		theExceptionsPackage.initializePackageContents();
		theLCPnetPackage.initializePackageContents();
		theExceptionsPackage_1.initializePackageContents();
		theFragmentsPackage.initializePackageContents();

		// Mark meta-data to indicate it can't be changed
		theModelsPackage.freeze();

		return theModelsPackage;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getPreferenceNetwork() {
		return preferenceNetworkEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getPreferenceNetwork_Nodes() {
		return (EReference)preferenceNetworkEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getPreferenceNetwork_Arcs() {
		return (EReference)preferenceNetworkEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getPreferenceNetwork_Outcomes() {
		return (EReference)preferenceNetworkEClass.getEStructuralFeatures().get(2);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getNode() {
		return nodeEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getNode_InArcs() {
		return (EReference)nodeEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getNode_OutArcs() {
		return (EReference)nodeEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getNode_Domain() {
		return (EReference)nodeEClass.getEStructuralFeatures().get(2);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getNode_PreferenceNetwork() {
		return (EReference)nodeEClass.getEStructuralFeatures().get(3);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getArc() {
		return arcEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getArc_StartNode() {
		return (EReference)arcEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getArc_EndNode() {
		return (EReference)arcEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getArc_PreferenceNetwork() {
		return (EReference)arcEClass.getEStructuralFeatures().get(2);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getNodeValue() {
		return nodeValueEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getNodeValue_Node() {
		return (EReference)nodeValueEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getOutcome() {
		return outcomeEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getOutcome_PreferenceNetwork() {
		return (EReference)outcomeEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getOutcome_NodeValues() {
		return (EReference)outcomeEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getNamable() {
		return namableEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getNamable_Name() {
		return (EAttribute)namableEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public ModelsFactory getModelsFactory() {
		return (ModelsFactory)getEFactoryInstance();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private boolean isCreated = false;

	/**
	 * Creates the meta-model objects for the package.  This method is
	 * guarded to have no affect on any invocation but its first.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void createPackageContents() {
		if (isCreated) return;
		isCreated = true;

		// Create classes and their features
		preferenceNetworkEClass = createEClass(PREFERENCE_NETWORK);
		createEReference(preferenceNetworkEClass, PREFERENCE_NETWORK__NODES);
		createEReference(preferenceNetworkEClass, PREFERENCE_NETWORK__ARCS);
		createEReference(preferenceNetworkEClass, PREFERENCE_NETWORK__OUTCOMES);

		nodeEClass = createEClass(NODE);
		createEReference(nodeEClass, NODE__IN_ARCS);
		createEReference(nodeEClass, NODE__OUT_ARCS);
		createEReference(nodeEClass, NODE__DOMAIN);
		createEReference(nodeEClass, NODE__PREFERENCE_NETWORK);

		arcEClass = createEClass(ARC);
		createEReference(arcEClass, ARC__START_NODE);
		createEReference(arcEClass, ARC__END_NODE);
		createEReference(arcEClass, ARC__PREFERENCE_NETWORK);

		nodeValueEClass = createEClass(NODE_VALUE);
		createEReference(nodeValueEClass, NODE_VALUE__NODE);

		outcomeEClass = createEClass(OUTCOME);
		createEReference(outcomeEClass, OUTCOME__PREFERENCE_NETWORK);
		createEReference(outcomeEClass, OUTCOME__NODE_VALUES);

		namableEClass = createEClass(NAMABLE);
		createEAttribute(namableEClass, NAMABLE__NAME);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private boolean isInitialized = false;

	/**
	 * Complete the initialization of the package and its meta-model.  This
	 * method is guarded to have no affect on any invocation but its first.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void initializePackageContents() {
		if (isInitialized) return;
		isInitialized = true;

		// Initialize package
		setName(eNAME);
		setNsPrefix(eNS_PREFIX);
		setNsURI(eNS_URI);

		// Obtain other dependent packages
		ExceptionsPackage theExceptionsPackage = (ExceptionsPackage)EPackage.Registry.INSTANCE.getEPackage(ExceptionsPackage.eNS_URI);
		LCPnetPackage theLCPnetPackage = (LCPnetPackage)EPackage.Registry.INSTANCE.getEPackage(LCPnetPackage.eNS_URI);

		// Add subpackages
		getESubpackages().add(theExceptionsPackage);
		getESubpackages().add(theLCPnetPackage);

		// Create type parameters

		// Set bounds for type parameters

		// Add supertypes to classes
		preferenceNetworkEClass.getESuperTypes().add(this.getNamable());
		nodeEClass.getESuperTypes().add(this.getNamable());
		arcEClass.getESuperTypes().add(this.getNamable());
		nodeValueEClass.getESuperTypes().add(this.getNamable());
		outcomeEClass.getESuperTypes().add(this.getNamable());

		// Initialize classes and features; add operations and parameters
		initEClass(preferenceNetworkEClass, PreferenceNetwork.class, "PreferenceNetwork", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getPreferenceNetwork_Nodes(), this.getNode(), this.getNode_PreferenceNetwork(), "nodes", null, 1, -1, PreferenceNetwork.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getPreferenceNetwork_Arcs(), this.getArc(), this.getArc_PreferenceNetwork(), "arcs", null, 0, -1, PreferenceNetwork.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getPreferenceNetwork_Outcomes(), this.getOutcome(), this.getOutcome_PreferenceNetwork(), "outcomes", null, 0, -1, PreferenceNetwork.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		addEOperation(preferenceNetworkEClass, this.getOutcome(), "getBestOutcomes", 0, -1, IS_UNIQUE, IS_ORDERED);

		addEOperation(preferenceNetworkEClass, this.getOutcome(), "orderOutcomes", 0, -1, IS_UNIQUE, IS_ORDERED);

		EOperation op = addEOperation(preferenceNetworkEClass, this.getOutcome(), "getOptimalOutcomes", 0, -1, IS_UNIQUE, IS_ORDERED);
		addEParameter(op, this.getNodeValue(), "constraints", 0, -1, IS_UNIQUE, IS_ORDERED);

		op = addEOperation(preferenceNetworkEClass, this.getNode(), "getNode", 0, 1, IS_UNIQUE, IS_ORDERED);
		addEParameter(op, ecorePackage.getEString(), "nodeName", 1, 1, IS_UNIQUE, IS_ORDERED);

		addEOperation(preferenceNetworkEClass, ecorePackage.getEString(), "getNodesNames", 1, -1, IS_UNIQUE, IS_ORDERED);

		initEClass(nodeEClass, Node.class, "Node", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getNode_InArcs(), this.getArc(), this.getArc_EndNode(), "inArcs", null, 0, -1, Node.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getNode_OutArcs(), this.getArc(), this.getArc_StartNode(), "outArcs", null, 0, -1, Node.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getNode_Domain(), this.getNodeValue(), this.getNodeValue_Node(), "domain", null, 1, -1, Node.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getNode_PreferenceNetwork(), this.getPreferenceNetwork(), this.getPreferenceNetwork_Nodes(), "preferenceNetwork", null, 1, 1, Node.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		addEOperation(nodeEClass, this.getNode(), "parentNodes", 0, -1, IS_UNIQUE, IS_ORDERED);

		addEOperation(nodeEClass, this.getNode(), "childNodes", 0, -1, IS_UNIQUE, IS_ORDERED);

		addEOperation(nodeEClass, this.getNode(), "inputNodes", 0, -1, IS_UNIQUE, IS_ORDERED);

		initEClass(arcEClass, Arc.class, "Arc", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getArc_StartNode(), this.getNode(), this.getNode_OutArcs(), "startNode", null, 1, 1, Arc.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getArc_EndNode(), this.getNode(), this.getNode_InArcs(), "endNode", null, 1, 1, Arc.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getArc_PreferenceNetwork(), this.getPreferenceNetwork(), this.getPreferenceNetwork_Arcs(), "preferenceNetwork", null, 1, 1, Arc.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(nodeValueEClass, NodeValue.class, "NodeValue", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getNodeValue_Node(), this.getNode(), this.getNode_Domain(), "node", null, 1, 1, NodeValue.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(outcomeEClass, Outcome.class, "Outcome", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getOutcome_PreferenceNetwork(), this.getPreferenceNetwork(), this.getPreferenceNetwork_Outcomes(), "preferenceNetwork", null, 0, 1, Outcome.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getOutcome_NodeValues(), this.getNodeValue(), null, "nodeValues", null, 1, -1, Outcome.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		op = addEOperation(outcomeEClass, this.getNodeValue(), "getNodeValue", 0, 1, IS_UNIQUE, IS_ORDERED);
		addEParameter(op, this.getNode(), "node", 1, 1, IS_UNIQUE, IS_ORDERED);
		addEException(op, theExceptionsPackage.getPreferenceException());

		op = addEOperation(outcomeEClass, this.getNodeValue(), "getParentValues", 0, -1, IS_UNIQUE, IS_ORDERED);
		addEParameter(op, this.getNodeValue(), "childNodeValue", 1, 1, IS_UNIQUE, IS_ORDERED);

		initEClass(namableEClass, Namable.class, "Namable", IS_ABSTRACT, IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getNamable_Name(), ecorePackage.getEString(), "name", null, 1, 1, Namable.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		// Create resource
		createResource(eNS_URI);
	}

} //ModelsPackageImpl
